'''
Created on Dec 6, 2011

@author: marcosvariz
'''
import pygame
import numpy

class window:
    def __init__(self,coord,size,superWindow):
        self.coord = coord
        self.superWindow = superWindow
        self.plotSize = size
        self.window = pygame.Surface(size)
        self.window.set_alpha(180)
        self.window.fill((0,0,0))
        self.camadas = []
        
    def getPlotSize(self):
        return self.plotSize
    
    #Adicionas camadas(surface) para serem desenhadas por ordem
    def adcCamada(self,camada):
        self.camadas.append(camada)
    
    def limpar(self):
        self.window.fill((0,0,0))
    
    def desenharCamadas(self):
        for c in self.camadas:
            self.window.blit(c,(0,0))
        self.superWindow.blit(self.window,self.coord)
    
    def desenhar(self,camada,coord = (0,0)):
        self.window.blit(camada,coord)
        self.superWindow.blit(self.window,self.coord)
        
            

class InfoWindow:
    def __init__(self,SCREEN):
        self.SCREEN = SCREEN
        self.estadoActivo = False
        #Definir tamanho e posicao das janelas
        coord=(SCREEN.get_width()*0.48,SCREEN.get_height()*0.05)
        size=(SCREEN.get_width()/2,SCREEN.get_width()/12*3)
        self.plotWindow = window(coord,size,SCREEN)
        self.textWindow = window((coord[1],coord[1]),(160,120),SCREEN)
        
        #Contruir e adicionar texto
        pygame.font.init()
        self.texto = pygame.font.SysFont("arial",18)
        self.textSurf = pygame.Surface(self.textWindow.getPlotSize())
        self.textWindow.adcCamada(self.textSurf)
        
        #Contruir e Adicionar grelha 
        grelha = pygame.Surface(self.plotWindow.getPlotSize())
        arrayGrelha = pygame.surfarray.pixels2d(grelha)
        s = self.plotWindow.getPlotSize()
        s = s[0]
        s = s / 6
        arrayGrelha[::s]=self.SCREEN.map_rgb((255,255,255))
        arrayGrelha[:,-1:0:-s]=self.SCREEN.map_rgb((255,255,255))
        self.plotWindow.adcCamada(grelha)
        #Criar e adicionar camada linha
        self.COLOR_LINHA_DENSIDADE = self.SCREEN.map_rgb((0,255,0))
        self.COLOR_LINHA_MEDIA = self.SCREEN.map_rgb((255,255,0))
        self.linha = pygame.Surface(self.plotWindow.getPlotSize())
        self.linha.set_colorkey((0,0,0))
        self.plotWindow.adcCamada(self.linha)
        
        #Lista de pontos para desenhar linhas
        self.pointListX = []
        self.pointListY = []
        #Media
        self.total = 0
        self.total300 = []
        
        
        
    
    def desenhar(self,densidade,ano,gGlobal,aprendizagemStatus,pause):
        if not pause:
            
            self.total300.append(densidade)
            self.total += densidade
            if len(self.pointListY) >= 300:
                self.pointListY.pop(0)
                self.total -= self.total300.pop(0)
                self.media = self.total/300
            else:
                self.pointListX.insert(0,self.linha.get_width()-(len(self.pointListY)*self.linha.get_width()/300))
                self.media = self.total/len(self.total300)
            self.pointListY.append((1-densidade)*self.linha.get_height())
            
        
        
        if self.estadoActivo: 
            self.linha.fill((0,0,0))
            self.textSurf.fill((0,0,0)) 
            self.plotWindow.limpar()
            self.textWindow.limpar()
            pygame.draw.line(self.linha, self.COLOR_LINHA_MEDIA, (0,(1-self.media)*self.linha.get_height()), (self.linha.get_width(),(1-self.media)*self.linha.get_height()), 2)
            pygame.draw.lines(self.linha, self.COLOR_LINHA_DENSIDADE,False,zip(self.pointListX, self.pointListY),2)
            self.textSurf.blit(self.texto.render("Densidade: "+str(round(densidade,2)), True, (255,255,255),(0,0,0)), (0,0))
            self.textSurf.blit(self.texto.render("Media: "+str(round(self.media,2)), True, (255,255,255),(0,0,0)), (0,self.texto.get_linesize()))   
            self.textSurf.blit(self.texto.render("Ano: "+str(ano),True, (255,255,255),(0,0,0)),(0,self.texto.get_linesize()*2))
            self.textSurf.blit(self.texto.render("g Global: "+str(gGlobal),True, (255,255,255),(0,0,0)),(0,self.texto.get_linesize()*3))
            self.textSurf.blit(self.texto.render("Apren. activa: "+str(aprendizagemStatus),True, (255,255,255),(0,0,0)),(0,self.texto.get_linesize()*4))
            
            self.plotWindow.desenharCamadas()
            self.textWindow.desenharCamadas()
            
    def flipEstado(self):
        self.estadoActivo = not self.estadoActivo
        return self.estadoActivo
        
        
        
